﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using QuanLyNganHangDe.BLL;
using QuanLyNganHangDe.DAL;
using QuanLyNganHangDe.DAL.Models;
using System.IO;
using System.Collections.Specialized;

namespace QuanLyNganHangDe.GUI.DuLieu
{

    /// <summary>
    /// Form ngân hàng câu hỏi
    /// </summary>
    public partial class FormDSNganHangCauHoi_Import : Form
    {
        public FormDSNganHangCauHoi_Import()
        {
            InitializeComponent();
            var ls = BizHocPhan.GetListHocPhanString();
            StringCollection grades = new StringCollection();
            grades.AddRange(ls.ToArray());
            lvFile.AddComboBoxCell(-1, 2, grades);
        }

        private string m_FolderPath;
        private bool suDungTenFile = false;
        List<string> ListFile = new List<string>();

        private void btnDocDuLieu_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(m_FolderPath))
                MessageBox.Show("Vui lòng chọn thư mục chứa dữ liệu");
            else
            {
                suDungTenFile = chkTenFile.Checked;
                ListFile.Clear();
                LoadALLFileWord(m_FolderPath);
            }
        }

        private void LoadALLFileWord(string folderPath)
        {
            lvFile.Items.Clear();
            List<ListViewItem> lvItem = new List<ListViewItem>();
            var bw = new BackgroundWorker() { WorkerSupportsCancellation = true, WorkerReportsProgress = true };
            bw.DoWork += (oSender, oE) =>
            {
                ProcessDirectory(folderPath);
                foreach (var item in ListFile)
                {
                    string tenFile = "";
                    if (suDungTenFile)
                    {
                        var tenFiles = item.Split(new char[] { '\\' });
                        tenFile = tenFiles[tenFiles.Length - 1].Split(new char[] { '.' })[0];
                        var hp = BizHocPhan.GetHocPhan(tenFile);
                        if (hp == null)
                            continue;
                        else
                            tenFile = hp.MaHocPhan + "-" + hp.TenHocPhan;
                    }
                    else
                    {

                    }
                    ListViewItem lv = new ListViewItem();
                    lv.SubItems.Add(item);
                    lv.SubItems.Add(tenFile);
                    lvItem.Add(lv);
                }
            };
            bw.RunWorkerCompleted += (oSender, oE) =>
            {

                lvFile.Items.AddRange(lvItem.ToArray());
                if (lvItem.Count > 0)
                {
                    btnNapDuLieu.Enabled = true;
                    lbDSTep.Text = "Danh sách tệp cần nạp: " + lvItem.Count + " tệp";
                }
                else
                {
                    lbDSTep.Text = "Danh sách tệp cần nạp";
                    btnNapDuLieu.Enabled = false;
                }
                picBusy.Visible = false;
            };
            bw.ProgressChanged += (oSender, oE) =>
            {

            };
            picBusy.Visible = true;
            bw.RunWorkerAsync();
        }

        private void txtFolderName_TextChanged(object sender, EventArgs e)
        {
            btnDocDuLieu.Enabled = true;
            btnNapDuLieu.Enabled = false;
        }

        private void ProcessDirectory(string targetDirectory)
        {
            // Process the list of files found in the directory. 
            string[] fileEntries = Directory.GetFiles(targetDirectory);
            foreach (string fileName in fileEntries)
                if (fileName.IndexOf(".docx") != -1)
                    ListFile.Add(fileName);

            // Recurse into subdirectories of this directory. 
            string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
            foreach (string subdirectory in subdirectoryEntries)
                ProcessDirectory(subdirectory);
        }

        private void lblSelectFile_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            FolderBrowserDialog dg = new FolderBrowserDialog();
            if (dg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                m_FolderPath = dg.SelectedPath;
                txtFolderName.Text = m_FolderPath;
            }
        }

        private void toolSelectAll_Click(object sender, EventArgs e)
        {
            foreach (ListViewItem item in lvFile.Items)
                item.Checked = item.Checked ? false : true;
        }

        private void btnNapDuLieu_Click(object sender, EventArgs e)
        {
            int suss = 0;
            foreach (ListViewItem item in lvFile.CheckedItems)
            {
                var fileName = item.SubItems[1].Text;
                var maHPs = item.SubItems[2].Text;
                if (string.IsNullOrEmpty(maHPs))
                    continue;
                else
                {
                    var hp = BizHocPhan.GetHocPhan(maHPs.Split(new char[] { '-' })[0]);
                    if (hp == null)
                        continue;
                    else
                    {
                        var ret = NapDSCH(fileName, hp);
                        if (ret == 1)
                        {
                            suss++;
                            item.SubItems.Add("Thành công");
                        }
                        else
                            item.SubItems.Add("Thất bại");
                    }
                }
            }
            string mess = string.Format("Số học phần được chọn: {0}\n\rSố học phần nạp thành công: {1}", lvFile.CheckedItems.Count, suss);
            DialogUtils.ShowMessage(mess);
        }

        /// <summary>
        /// Nạp danh sách câu hỏi cho một học phần
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="hp"></param>
        /// <returns>-1: File không đúng định dạng
        /// -2: Danh sách câu hỏi không đúng hoặc chưa chọn học phần để lưu
        /// 1: Thành công
        /// </returns>
        private int NapDSCH(string fileName, HocPhan hp)
        {
            bool suDungDapAn = chkCoSuDungDapAn.Checked;
            WordHelper wH = new WordHelper();
            var fi = new System.IO.FileInfo(fileName);
            #region Dung commented
            /*
            #region 1. createFolder("%AppData%/QLNHD");
            string folderPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
                    "QLNHD");
            if (System.IO.Directory.Exists(folderPath) == false)
            {
                try
                {
                    System.IO.Directory.CreateDirectory(folderPath);
                }
                catch (Exception exc)
                {

                    return -1;
                }
            }
            #endregion

            #region 2. string taggedFileName = ...
            string fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(fileName);
            int idx = 0;
            string taggedFileName;
            while (true)
            {
                if (idx == 0)
                    taggedFileName = System.IO.Path.Combine(folderPath, string.Format("{0}.docx", fileNameWithoutExtension));
                else
                    taggedFileName = System.IO.Path.Combine(folderPath, string.Format("{0}-{1}.docx", fileNameWithoutExtension, idx));

                bool taggedFileNameIsOK = false;
                if (System.IO.File.Exists(taggedFileName))
                {
                    #region Xem thử có thể xoá được file này hay không
                    try
                    {
                        System.IO.File.Delete(taggedFileName);
                        taggedFileNameIsOK = true;
                    }
                    catch
                    {
                        taggedFileNameIsOK = false;
                    }
                    #endregion
                }
                else
                    taggedFileNameIsOK = true;

                if (taggedFileNameIsOK == false)
                    idx++;
                else
                    break;
            }
            #endregion

            #region 3. create taggedFileName from fileName
            try
            {
                QuanLyNganHangDe.BLL.WordConvertor.Utils.ExportTaggedDocumentOf(fileName, taggedFileName);
            }
            catch (Exception exc)
            {
                //DialogUtils.ShowError(string.Format("Không thể tạo tệp đánh dấu cho tệp [{0}] được.\nChi tiết lỗi {1}", fileName, exc.Message));
                return -1;
            }
            #endregion
            */

            #endregion
            var dsCauHoi = wH.ReadMSWordToListQuestion(fileName, suDungDapAn);
            if (dsCauHoi != null && dsCauHoi.Count > 0)
            {
                if (hp != null)
                {
                    BizCauHoi.AddDSCauHoi(dsCauHoi, hp);
                    return 1;
                }
                else
                    return -2;
            }
            else
                return -2;
        }
    }
}
